package com.hw.sasso.controller;

import cn.dev33.satoken.sso.SaSsoProcessor;
import cn.dev33.satoken.sso.SaSsoUtil;
import cn.dev33.satoken.stp.StpUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * @program: sa-token-start
 * @author: hewei
 * @date: 2023-09-11 11:20
 **/

@Slf4j
@RestController
public class SsoClientController {

    // 首页
    @RequestMapping("/")
    public String index() {
        String str = "<h2>Sa-Token SSO模式二-Client 应用端</h2>" +
                "<p>当前会话是否登录：" + StpUtil.isLogin() + "</p>" +
                "<p><a href=\"javascript:location.href='/sso/login?back=' + encodeURIComponent(location.href);\">登录</a> " +
                "<a href='/sso/logout?back=self'>注销</a></p>";
        return str;
    }

    /*
     * SSO-Client端：处理所有SSO相关请求
     *         http://{host}:{port}/sso/login          -- Client端登录地址，接受参数：back=登录后的跳转地址
     *         http://{host}:{port}/sso/logout         -- Client端单点注销地址（isSlo=true时打开），接受参数：back=注销后的跳转地址
     *         http://{host}:{port}/sso/logoutCall     -- Client端单点注销回调地址（isSlo=true时打开），此接口为框架回调，开发者无需关心
     */
    @RequestMapping("/sso/*")
    public Object ssoRequest() {
        return SaSsoProcessor.instance.clientDister();
    }


    // 查询我的账号信息，调用Server 端固定的地址/sso/getData
    @RequestMapping("/sso/myInfo")
    public Object myInfo() {
        // 组织请求参数
        Map<String, Object> map = new HashMap<>();
        map.put("apiType", "userinfo");
        map.put("loginId", StpUtil.getLoginId());

        // 发起请求
        Object resData = SaSsoUtil.getData(map);
        log.info("sso-server 返回的信息：{}" ,resData);
        return resData;
    }

    // 自定义服务查询，调用 server 端任意的地址 /sso/*，这里定义了一个 "/service" 路径
    @RequestMapping("/sso/service")
    public Object service() {
        // 组织请求参数
        Map<String, Object> map = new HashMap<>();
        map.put("loginId", StpUtil.getLoginId());

        // 发起请求 （传入自定义的 path 地址）
        Object resData = SaSsoUtil.getData("/sso/service", map);
        System.out.println("sso-server 返回的信息：" + resData);
        return resData;
    }

    /*模式三：当前对session数据并没有做同步*/
    @RequestMapping("/setSessionData")
    public String setSessionData() {
        StpUtil.getSession().set("name","何伟");
        return "设置成功！";
    }
    @RequestMapping("/getSessionData")
    public String getSessionData() {
        return (String) StpUtil.getSession().get("name");
    }

}
